#ifndef _WX_WXMMSTREAM_H__
#define _WX_WXMMSTREAM_H__

#include "wx/defs.h"

#if wxUSE_STREAMS

#include "wx/stream.h"

class wxMemoryOutputStream;

class wxMemoryInputStream : public wxInputStream {
  public:
    wxMemoryInputStream( const void *data, size_t length );
    wxMemoryInputStream( const wxMemoryOutputStream& stream );
    virtual ~wxMemoryInputStream();
    virtual wxFileOffset GetLength() const { return m_length; }
    virtual bool IsSeekable() const { return true; }
    char Peek();
    wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; }
    wxDEPRECATED( wxStreamBuffer *InputStreamBuffer() const );
  protected:
    wxStreamBuffer *m_i_streambuf;
    size_t OnSysRead( void *buffer, size_t nbytes );
    wxFileOffset OnSysSeek( wxFileOffset pos, wxSeekMode mode );
    wxFileOffset OnSysTell() const;
  private:
    size_t m_length;
    DECLARE_NO_COPY_CLASS( wxMemoryInputStream )
};

class wxMemoryOutputStream : public wxOutputStream {
  public:
    // if data is !NULL it must be allocated with malloc()
    wxMemoryOutputStream( void *data = NULL, size_t length = 0 );
    virtual ~wxMemoryOutputStream();
    virtual wxFileOffset GetLength() const { return m_o_streambuf->GetLastAccess(); }
    virtual bool IsSeekable() const { return true; }
    size_t CopyTo( void *buffer, size_t len ) const;
    wxStreamBuffer *GetOutputStreamBuffer() const { return m_o_streambuf; }
    wxDEPRECATED( wxStreamBuffer *OutputStreamBuffer() const );
  protected:
    wxStreamBuffer *m_o_streambuf;
  protected:
    size_t OnSysWrite( const void *buffer, size_t nbytes );
    wxFileOffset OnSysSeek( wxFileOffset pos, wxSeekMode mode );
    wxFileOffset OnSysTell() const;

    DECLARE_NO_COPY_CLASS( wxMemoryOutputStream )
};

inline wxStreamBuffer *wxMemoryInputStream::InputStreamBuffer() const { return m_i_streambuf; }
inline wxStreamBuffer *wxMemoryOutputStream::OutputStreamBuffer() const { return m_o_streambuf; }

#endif
// wxUSE_STREAMS

#endif
